 //***************************************************//
 //*  Creado por : Gustavo Ardito
 //*  fecha creacion : 05/04/2008
 //* 
 //*  Modificado por: Gustavo Ardito
 //*  fecha Modificacion: 08/09/2008
 //*  Motivo de Modificacion: agregue borrar con parametros()
 //***************************************************//
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Entidades;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;
using System.Configuration;

namespace SistemaProduccion.DAL
{

        public abstract class AD_ABM
        {
            #region propiedades
            private string _connectionString;
            public string connectionString
            {
                get
                {
                    _connectionString = @"Data Source=GUSTAVIUS-HP\SQLEXPRESS2008;Initial Catalog=ConstructoraDB;User ID=sa ;Password = ahch1810";//ConfigurationManager.AppSettings["cadenaConexion"];
                    return _connectionString;
                }
                set { _connectionString = value; }
            }

            protected enum TipoDato
            {
                GUID = 1,
                STRING = 2,
                INT = 3,
                DATETIME = 4,
                BOOL = 5,
                VARCHAR = 6
            }

            private SP_Constructora _SP;

            private SP_Constructora SP
            {
                get
                {
                    if (_SP == null) { _SP = new SP_Constructora(); }
                    return _SP;
                }
                set { _SP = value; }
            }

            #endregion propiedades

            #region metodos

            /// <summary>
            /// Indica si el dtsErrores 
            /// </summary>
            /// <param name="errores"></param>
            /// <returns></returns>
            protected bool getError(dtsErrores errores)
            {
                bool valido = false;
                if (errores.Error[0].hayError > 0)
                {
                    valido = true;
                }
                return valido;
            }

            #region metodos Leer
            /// <summary>
            /// Devuelve un dataset a partir de uno tipado
            /// </summary>
            /// <param name="dts">Dataset a llenar, que se utiliza para determinar el SP a utilizar</param>
            /// <param name="nomTabla">Nombre de la Tabla a llenar</param>
            /// <returns></returns>
            protected DataSet AD_Leer(DataSet dts, string nomTabla , string nomProc)
            {
                string[] nombreTablas = new string[] { nomTabla };

                return AD_Leer(dts, nombreTablas,nomProc);
            }
            /// <summary>
            /// Devuelve un dataset a partir de uno tipado
            /// </summary>
            /// <param name="dts">Dataset tipado a llenar, que se utiliza para determinar el SP a utilizar</param>
            /// <param name="nomTablas">Nombre de las Tablas a llenar</param>
            /// <param name="nomProc">Nombre del Procedimiento Almacenado</param>
            /// <returns></returns>
            protected DataSet AD_Leer(DataSet dts, string[] nomTablas,string nomProc)
            {                
                SqlHelper.FillDataset(connectionString
                  , nomProc
                  , dts
                  , nomTablas);
                return dts;
            }


            /// <summary>
            /// Devuelve un dataset a partir de uno tipado y una lista de parametros
            /// </summary>
            /// <param name="dts">Dataset tipado o no para llenar</param>
            /// <param name="nomTabla">Nombre de la Tabla a llenar</param>
            /// <param name="nomProc">Nombre del Procedimiento almacenado</param>
            /// <param name="param">Lista de parametros del SP</param>
            /// <returns></returns>
            protected DataSet AD_Leer(DataSet dts, string nomTabla,string nomProc, string[,] param)
            {
                string[] nombreTablas = new string[] { nomTabla };
                return AD_Leer(dts, nombreTablas,nomProc,param);
            }
            /// <summary>
            /// Devuelve un dataset a partir de uno tipado y una lista de parametros
            /// </summary>
            /// <param name="dts">Dataset tipado a llenar</param>            
            /// <param name="nomTablas">Nombre de las Tablas a llenar</param>
            /// <param name="nomProc">Nombre del Procedimiento almacenado</param>
            /// <param name="param">Lista de parametros del SP</param>
            /// <returns></returns>
            protected DataSet AD_Leer(DataSet dts,string[] nomTablas,string nomProc, string[,] param)
            {
                SqlHelper.FillDataset(connectionString
                  , nomProc
                  , dts
                  , nomTablas
                  , GetListaSQLParameters(param));
                return dts;
            }


            #endregion Leer

            #region Eliminar
            //protected dtsErrores AD_Borrar(string id, Tablas tbl)
            //{
            //    DataSet dts = null;
            //    try
            //    {
            //        dts = SqlHelper.ExecuteDataset(
            //         connectionString, SP.Borrar(tbl)
            //         , new SqlParameter(GetNombreIdTabla(tbl), new Guid(id))
            //         );
            //    }
            //    catch (Exception err) { string msg = err.Message; }
            //    return MapearErrores(dts);
            //}


            /// <summary>
            /// 
            /// </summary>
            /// <param name="nomProc"></param>
            /// <param name="param"></param>
            /// <returns></returns>
            protected dtsErrores AD_Borrar(string nomProc, string[,] param)
            {
                DataSet dts = null;
                try
                {
                    dts = SqlHelper.ExecuteDataset(
                     connectionString
                     , nomProc
                     ,GetListaSQLParameters(param)
                     );
                }
                catch (Exception err) { string msg = err.Message; }
                return MapearErrores(dts);
            }

            #endregion Eliminar

            #region Agregar
            /// <summary>
            ///  Recibe la lista de parametros y la tabla a guardar, con tabla determino el SP a usar,
            /// en 'param' viene la lista de parametros.
            /// </summary>
            protected dtsErrores AD_Agregar(string nomProc,string[,] param)
            {
                DataSet dts = null;

                dts = SqlHelper.ExecuteDataset(
                    connectionString
                    , nomProc
                    , GetListaSQLParameters(param)
                    );

                return MapearErrores(dts);
            }
            ///// <summary>
            /////  Recibe la lista de parametros y la tabla a guardar, con tabla determino el SP a usar,
            ///// en 'param' viene la lista de parametros.
            ///// </summary>
            //protected dtsErrores AD_Agregar(string[,] param, Tablas tbl)
            //{
            //    DataSet dts = null;
               
            //    dts = SqlHelper.ExecuteDataset(
            //        connectionString, SP.Agregar(tbl)
            //        , GetListaSQLParameters(param)
            //        );              
               
            //    return MapearErrores(dts);
            //}
            #endregion metodos Agregar

            #region metodos Modificar
            protected dtsErrores AD_Modificar(string nomProc, string[,] nomParam)
            {
                DataSet dts = null;

                //             try
                //{
                    dts = SqlHelper.ExecuteDataset(
                         connectionString
                         , nomProc
                         , GetListaSQLParameters(nomParam)
                         );
               // }
              //  catch (Exception err) { string msg = err.Message; }
                return MapearErrores(dts);
            }
            #endregion metodos Modificar

            /// <summary>
            /// En caso de error el SP devuelve un dataset con tres valores. 
            ///     1ero: 0 o 1 - tiene o no tiene error
            ///     2do:  nro de error.
            ///     3ro:  Descripcion del Error.             
            /// </summary>
            /// <param name="dts"></param>
            /// <returns></returns>
            protected static dtsErrores MapearErrores(DataSet dts)
            {
                dtsErrores Resultado = new dtsErrores();
                object[] valores;
                valores = dts.Tables[0].Rows[0].ItemArray;
                Resultado.Error.AddErrorRow(
                      Convert.ToInt32(valores[0])
                    , Convert.ToInt32(valores[1])
                    , Convert.ToString(valores[2])
                    );
                return Resultado;
            }
                      
            private SqlParameter[] GetListaSQLParameters(string[,] parametros)
            {
                int cant = (parametros.Length / 3);
                SqlParameter[] lista = new SqlParameter[cant];
                for (int i = 0; i < cant; i++)
                {
                    lista[i] = new SqlParameter(parametros[i, 0], GetTipoParametro(parametros[i, 2]));
                    lista[i].Value = GetValorParametro(parametros[i, 1], parametros[i, 2]);
                }
                return lista;
            }

            private SqlDbType GetTipoParametro(string tipo)
            {
                SqlDbType tipoParam = SqlDbType.Xml;
                if (tipo == TipoDato.STRING.ToString()) { tipoParam = SqlDbType.Char; }
                else if (tipo == TipoDato.GUID.ToString()) { tipoParam = SqlDbType.UniqueIdentifier; }
                else if (tipo == TipoDato.INT.ToString()) { tipoParam = SqlDbType.Int; }
                else if (tipo == TipoDato.DATETIME.ToString()) { tipoParam = SqlDbType.DateTime; }
                else if (tipo == TipoDato.BOOL.ToString()) { tipoParam = SqlDbType.Bit; }
                else if (tipo == TipoDato.VARCHAR.ToString()) { tipoParam = SqlDbType.VarChar; }
                return tipoParam;
            }

            private object GetValorParametro(string valor, string tipo)
            {
                object parametro = new object();
                if (tipo == TipoDato.STRING.ToString()) { parametro = valor; }
                else if (tipo == TipoDato.VARCHAR.ToString()) { parametro = valor; }
                else if (tipo == TipoDato.GUID.ToString())
                {
                    parametro = valor;
                    if (valor != null) parametro = new Guid(valor);
                }
                else if (tipo == TipoDato.INT.ToString()) { parametro = Convert.ToInt32(valor); }
                else if (tipo == TipoDato.DATETIME.ToString()) { parametro = Convert.ToDateTime(valor); }
                else if (tipo == TipoDato.BOOL.ToString()) { parametro = Convert.ToBoolean(valor); }
                return parametro;
            }
                       
            protected string armarXML(DataTable dt)
            {
                string cadenaXML = "";

                cadenaXML = "<root>" ;
                foreach (DataRow dr in dt.Rows)
                {
                    cadenaXML =cadenaXML + "<" + dt.TableName.ToUpper()+" ";    
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        cadenaXML = cadenaXML + dt.Columns[i].ColumnName.ToUpper() + "=" + Convert.ToChar(34) + dr[i].ToString() + Convert.ToChar(34)+" ";
                    }
                    cadenaXML = cadenaXML + "/>";
                }
                cadenaXML = cadenaXML + "</root>";                
                
                return cadenaXML;
            }
            #endregion

            #region Datos StoreProcedures
            //protected string GetNombreStrProcLeer(DataSet dts)
            //{
            //    return SP.Leer(dts);
            //}
            //protected string GetNombreStrProcLeer(Tablas dts)
            //{
            //    return SP.Leer(dts);
            //}
            //protected string GetNombreStrProcFiltrar(DataSet dts)
            //{
            //    return SP.Filtrar(dts);
            //}
            ////private string GetNombreStrProcFiltrar(DataSet dts, Caracteristica caract)
            ////{
            ////    return SP.Filtrar(dts, caract);
            ////}

            //protected string GetNombreStrProcExistencia(Tablas tbl)
            //{
            //    return SP.Existencia(tbl);
            //}

            //protected string GetNombreStrProcBorrar(Tablas tbl)
            //{
            //    return SP.Borrar(tbl);
            //}

            //protected string GetNombreStrProcAgregar(Tablas tbl)
            //{
            //    return SP.Agregar(tbl);
            //}

            //protected string GetNombreStrProcModificar(Tablas tbl)
            //{
            //    return SP.Modificar(tbl);
            //}

            //protected string GetNombreIdTabla(Tablas tbl)
            //{
            //    return SP.getIdTabla(tbl);
            //}

            #endregion Datos StoreProcedures
        }
    }

